package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Vector;

import Controlador.Utils;
import Negocio.Cosecha;
import Negocio.ItemMineral;
import Negocio.Lote;
import Negocio.LoteSimple;
import Negocio.Propietario;

public class AdmPersistenciaLoteSimple extends AdministradorPersistencia {

	private static AdmPersistenciaLoteSimple instancia;
	private AdmPersistenciaItemMineral ItemPersistencia;

	private AdmPersistenciaLoteSimple() {
		ItemPersistencia = AdmPersistenciaItemMineral.getInstancia();
	}

	public static AdmPersistenciaLoteSimple getInstancia() {
		if (instancia == null)
			instancia = new AdmPersistenciaLoteSimple();
		return instancia;
	}

	public void borrar(Object o) {
		System.out.println("Entro al delete");
		try {
			LoteSimple a = (LoteSimple) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("update  Lote set estado = ? where codigo = ?");
			s.setString(1, Utils.CONSTANTE_INACTIVO);
			s.setLong(2, a.getCodigo());
			s.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/** Corregir implementacion */
	public Long insertar(Object o) {
		System.out.println("Entro al insert");
		try {
			LoteSimple a = (LoteSimple) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("insert into lote values (?,?,?,?,?)");
			// agregar campos
			s.setString(1, Utils.CONSTANTE_LOTE_SIMPLE);
			s.setInt(2, Utils.CONSTANTE_INT_SIN_USO);
			s.setDouble(3, a.getAreaSiembra());
			s.setString(4, Utils.CONSTANTE_ACTIVO);
			s.setLong(5, a.getProp().getDni());
			s.execute();
			s.close();

			s = con.prepareStatement("select max(codigo) from lote");
			ResultSet result = s.executeQuery();
			Long res = null;
			if (result.next())
				res = result.getLong(1);
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return res;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	@Override
	public Vector<Object> buscarTodos() {
		return null;
		// TODO hacer implementacion

	}

	@Override
	public void modificar(Object o) {

		System.out.println("Entro al update");
		LoteSimple a = (LoteSimple) o;
		Connection con = PoolConnection.getPoolConnection().getConnection();
		PreparedStatement s;
		try {

			s = con
					.prepareStatement("update  Lote set area = ?, tipo = ? , propietario = ? where codigo = ?");
			s.setDouble(1, a.getAreaSiembra());
			s.setString(2, a.getTipo());
			s.setLong(3, a.getProp().getDni());
			s.setLong(4, a.getCodigo());
			s.execute();

			ItemPersistencia.eliminarReferencia(a.getCodigo());

			if (a.getUltimaCoseacha() != null) {
				s = con.prepareStatement("insert into cosecha_lote values (?,?)");
				s.setLong(1, a.getUltimaCoseacha().getCodigo());
				s.setLong(1, a.getCodigo());
				s.execute();
			}
			System.out.println("Ejecuto");
			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	@Override
	public Object buscarPorCodigo(Object o) {

		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Lote where tipo = 's' and codigo = ?");
			s.setLong(1, (Long) o);
			ResultSet rta = s.executeQuery();
			LoteSimple l = null;
			if (rta.next()) {

				Collection<ItemMineral> it = AdmPersistenciaItemMineral
						.getInstancia().obtenerPorLote((Long) o);
				ItemMineral pri = null;
				for (ItemMineral i : it) {
					if (Utils.CONSTANTE_PRIMARIO.equals(i.getTipo())) {
						pri = i;
						it.remove(i);
					}
				}
				Propietario prop = (Propietario) AdmPersistenciaPropietario
						.getInstancia().buscarPorCodigo(rta.getLong(6));
				l = new LoteSimple(rta.getLong(1), pri, rta.getString(2), it,
						rta.getDouble(4), prop, rta.getString(5));

				Cosecha cos = AdmPersistenciaCosecha.getInstancia().buscarUltimaLote(rta.getLong(1));
				l.setUltimaCoseacha(cos);
			}

			PoolConnection.getPoolConnection().realeaseConnection(con);

			return l;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public Vector<LoteSimple> buscarPorLoteComponente(Object o) {

		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Lote where tipo = 's' and loteQueCompone = ? and estado = 's' ");
			s.setLong(1, (Long) o);
			ResultSet rta = s.executeQuery();
			Vector<LoteSimple> lotes = new Vector<LoteSimple>();
			LoteSimple l = null;
			while (rta.next()) {

				Collection<ItemMineral> it = AdmPersistenciaItemMineral
						.getInstancia().obtenerPorLote(rta.getLong(1));
				ItemMineral pri = null;
				for (ItemMineral i : it) {
					if (Utils.CONSTANTE_PRIMARIO.equals(i.getTipo())) {
						pri = i;
						it.remove(i);
					}
				}
				Propietario prop = (Propietario) AdmPersistenciaPropietario
						.getInstancia().buscarPorCodigo(rta.getLong(6));
				l = new LoteSimple(rta.getLong(1), pri, rta.getString(2), it,
						rta.getDouble(4), prop, rta.getString(5));
				Cosecha cos = AdmPersistenciaCosecha.getInstancia().buscarUltimaLote(rta.getLong(1));
				l.setUltimaCoseacha(cos);
				
				lotes.add(l);
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return lotes;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public Vector<Lote> buscarPorLoteSiembra(long o) {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from lote where tipo = 's' and codigo in (select nroLote from siembra_lote where idsiembra = ?)");
			s.setLong(1, (Long) o);
			ResultSet rta = s.executeQuery();
			Vector<Lote> lotes = new Vector<Lote>();
			LoteSimple l = null;
			while (rta.next()) {

				Collection<ItemMineral> it = AdmPersistenciaItemMineral
						.getInstancia().obtenerPorLote(rta.getLong(1));
				ItemMineral pri = null;
				for (ItemMineral i : it) {
					if (Utils.CONSTANTE_PRIMARIO.equals(i.getTipo())) {
						pri = i;
						it.remove(i);
					}
				}
				Propietario prop = (Propietario) AdmPersistenciaPropietario
						.getInstancia().buscarPorCodigo(rta.getLong(6));
				l = new LoteSimple(rta.getLong(1), pri, rta.getString(2), it,
						rta.getDouble(4), prop, rta.getString(5));
				Cosecha cos = AdmPersistenciaCosecha.getInstancia().buscarUltimaLote(rta.getLong(1));
				l.setUltimaCoseacha(cos);
				
				lotes.add(l);
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return lotes;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}
